Code sample Home

Making custom commands by using function lcWndWaitPoint2


//===============================================================================
// Let user to pick 2 points on a window to create a Line entity
//===============================================================================

//-----------------------------------------------
void CALLBACK EventCmdLine (int Prm, HANDLE hLcWnd)
{
  double x0, y0, x1, y1;
  if (Prm == 2){
    x0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT0 );
    y0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT1 );
    x1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURX );
    y1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURY );
    lcPaint_DrawLine( hLcWnd, x0, y0, x1, y1 );
  }
}

//-----------------------------------------------
void DemoWaitPoint_Line (HANDLE hLcWnd)
{
  double X1, Y1, X2, Y2;
  HANDLE hBlock;

  // get a block, linked with CAD window
  hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_BLOCK );
  for (;;){
    if (lcWndWaitPoint2( hLcWnd, L"Pick first point", &X1, &Y1, EventCmdLine, 1 )){
      lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT0, X1 );
      lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, Y1 );
      if (lcWndWaitPoint2( hLcWnd, L"Pick second point", &X2, &Y2, EventCmdLine, 2 )){
        lcBlockAddLine( hBlock, X1, Y1, X2, Y2 );
        lcWndRedraw( hLcWnd );
      }else{
        break;  // exit cycle
      }
    }else{
      break;  // exit cycle
    }
  }
}

//===============================================================================
// Let user to pick 2 points on a window to create a Circle entity
//===============================================================================

//-----------------------------------------------
void CALLBACK EventCmdCirc (int Prm, HANDLE hLcWnd)
{
  WCHAR  szText[256];
  double x0, y0, x1, y1, Rad;
  HANDLE hPtbuf;

  x1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURX );
  y1 = lcPropGetFloat( hLcWnd, LC_PROP_WND_CURY );
  if (Prm == 1){
    swprintf( szText, L"Center point %.2f, %.2f", x1, y1 );
    lcCmdCursorText( hLcWnd, szText );
  }else
  if (Prm == 2){
    x0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT0 );
    y0 = lcPropGetFloat( hLcWnd, LC_PROP_WND_FLOAT1 );
    lcPaint_DrawLine( hLcWnd, x0, y0, x1, y1 );
    Rad = _hypot( x1-x0, y1-y0 );
    hPtbuf = lcPaint_CreatePtbuf();
    lcPaint_PtbufAddCircle( hPtbuf, x0, y0, Rad, 128 );
    lcPaint_DrawPtbuf( hLcWnd, hPtbuf, true );
    lcPaint_DeletePtbuf( hPtbuf );
    swprintf( szText, L"Radius %.2f", Rad );
    lcCmdCursorText( hLcWnd, szText );
  }
}

//-----------------------------------------------
void DemoWaitPoint_Circ (HANDLE hLcWnd)
{
  double X1, Y1, X2, Y2, Rad;
  HANDLE hBlock;

  // get a block, linked with CAD window
  hBlock = lcPropGetHandle( hLcWnd, LC_PROP_WND_BLOCK );
  for (;;){
    if (lcWndWaitPoint2( hLcWnd, L"Center", &X1, &Y1, EventCmdCirc, 1 )){
      lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT0, X1 );
      lcPropPutFloat( hLcWnd, LC_PROP_WND_FLOAT1, Y1 );
      if (lcWndWaitPoint2( hLcWnd, L"Radius", &X2, &Y2, EventCmdCirc, 2 )){
        Rad = _hypot( X2-X1, Y2-Y1 );
        lcBlockAddCircle( hBlock, X1, Y1, Rad, false );
        lcWndRedraw( hLcWnd );
      }else{
        break;  // exit cycle
      }
    }else{
      break;  // exit cycle
    }
  }
}